<?php
/**
 * 通用函数库
 */


if (!function_exists('config')) {
    /**
     * 获取配置，如果在一个模块里面调用这个方法，
     * 那么他就只能获取到 PROJECT_DIR/config/common.php 和 MODULE_DIR/config/common.php中的配置
     * @param $key string 要获取的配置文件的key， 如果key='', 那么就返回所有的配置
     * @return array|string|int|null 对应的key不存在的时候返回null， 否则返回其对应的内容
     * @throws
     */
    function config(string $key = '') {
        $application = \core\utils\BeanManager::getInstance()->getBean(\core\Application::class);
        static $allConfig;
        // 获得模块名
        $module = $application->getModule();
        // 懒加载配置文件
        if ($module) { // 在模块里面调用的
            // 加载配置文件
            if (!isset($allConfig[$module])) {
                if (!isset($allConfig[0])) {
                    $allConfig[0] = require 'config/common.php';
                }
                $moduleConfig = [];
                if (file_exists(\core\utils\ConstUtils::MODULE_DIR.'/'.$module.'/config/common.php')) {
                    $moduleConfig = require \core\utils\ConstUtils::MODULE_DIR.'/'.$module.'/config/common.php';
                }
                $allConfig[$module] = array_merge($allConfig[0], $moduleConfig);
            }
        } else { // 不是在模块里面调用的
            if (!isset($allConfig[0])) {
                $allConfig[0] = require 'config/common.php';
            }
        }


        $index = '' == $module ? 0 : $module;
        if ('' === $key) {
            return $allConfig[$index];
        } else {
            $base = $allConfig[$index];
            if (strpos($key, '.')) {
                $trueKeyArray = explode('.', $key);
                foreach ($trueKeyArray as $k) {
                    $base = $base[$k] ?? null;
                }
                return $base;
            }
            return $allConfig[$index][$key] ?? null;
        }
    }
}

if (!function_exists('isPattern')) {
    /**
     * 检查是否是一个正则表达式
     * @param string $val
     * @return bool
     */
    function isPattern(string $val) : bool {
        return strlen($val) > 1 && $val[0] == '/' && strrpos($val, '/') > 0 && $val[strrpos($val, '/') - 1] != '\\';
    }
}